SQL クエリをうまく動作させるためのインデックス付け
SQL クエリをうまく動作させるためのインデックス付け
インデックスを最もうまく設計できるのは DBA ではなく開発者
リレーショナルデータベースにおける null は、特別な値 (未知であることを示す)
他と等しいとか、等しくないといったことはない
IS NULL という特別な述語が必要
null をインデックスがどう扱うか (さらにいうと空文字列を null と同等の扱いにするかどうか) は各 DBMS によって異なる
インデックススキャン (inde scan) やテーブルスキャン (table scan) ではなくインデックスシーク (index seek) が行われるように
テーブルスキャンよりはインデックススキャンの方が通常は高速 (データが小さいため)
とはいえテーブルスキャンの方が高速な場合もある
インデックスの作成はデータ更新を低速化させる
一般的なインデックスの種類は B 木 (B-tree) → B 木構造のインデックス
インデックスには、クエリ時のフィルタリング以外に以下の効果
クエリ実行時の結合アルゴリズム
主要な 3 種類
ネステッドループ結合 (nested loop) : ループを回して結合するイメージ。 インデックスが効果的
ハッシュ結合 (hash join) : 結合時にハッシュテーブルが作成されるため、インデックスは必要ない (?)
WHERE 述語と ON 述語ではインデックスを使用するっぽい
ソートマージ結合 (sort-merge join) : 両側をソートするのでコストが高いが、ソート済みのインデックスがあれば効果的
データのクラスタ化 (= 連続的にアクセスされるデータを隣り合わせに配置する)
ORDER BY の効率性
フィルター選択されたインデックスというものもある
関数ベースのインデックスもある
参考文献
Effective SQL